import 'dart:io';
import 'package:dio/dio.dart';
import 'package:dio/io.dart';
import 'package:flutter/material.dart';

/// 作者: Tao
/// 日期: 2024/3/18
/// 时间: 14:30
/// 描述: 网络请求
/// 为啥要配置代理？
/// 在APP调试阶段，一般会利用一些 抓包工具 (如Charles、Fidder) 来抓取网络请求接口，以方便接口联调。
/// 然后你会发现 原生APP可以抓包，Flutter App却抓不了包，这是咋回事😳？这是因为 Flutter APP的网络请求是不走手机的系统代理的，
/// 它不走，自然抓不到，想抓的话需要我们 手动给它设置一个http代理，而DefaultHttpClientAdapter 提供了 onHttpClientCreate()
/// 的回调用于设置 底层HttpClient的代理。Charles就可以Flutter App的请求包啦😁~
class WanAndroid {
  // 构造函数 ,网络请求过程中需要上下文，如打开一个新路由
  WanAndroid([this.context]) {
    options = Options(extra: {'context': context});
  }

  BuildContext? context; // 上下文
  late Options options; // 请求配置
  static const bool enableProxy = false; // 是否启用代理

  static Dio dio = Dio(BaseOptions(
    baseUrl: 'https://www.wanandroid.com/',
    connectTimeout: const Duration(seconds: 30),
    receiveTimeout: const Duration(seconds: 30),
    responseType: ResponseType.plain, // 响应数据类型,默认为json,这里我们设置为plain
  ));

  static void init() {
    // 调试阶段启用抓包代理
    if (enableProxy) {
      // 启用代理
      dio.httpClientAdapter = IOHttpClientAdapter(createHttpClient: () {
        var client = HttpClient();
        // 将请求代理到 本机IP:8888，是抓包电脑的IP！！！
        client.findProxy = (uri) {
          return 'PROXY 192.168.0.102:8888';
        };
        // 抓包工具一般都会提供一个自签名的证书，会通不过证书校验，这里禁用下
        client.badCertificateCallback =
            (X509Certificate cert, String host, int port) => true;
        return client;
      });
    }

    dio.interceptors.add(InterceptorsWrapper(
      onRequest: (options, handler) {
        // 在请求被发送之前做一些事情
        // 例如加密数据、添加token等
        print('请求的Url：${options.uri}');
        return handler.next(options); //continue
      },
      onResponse: (response, handler) {
        // 在返回响应数据之前做一些预处理
        print('响应的数据：${response.data}');
        return handler.next(response); // continue
      },
      onError: (DioError e, handler) {
        // 当请求失败时做一些预处理
        return handler.next(e); //continue
      },
    ));

  }

  // 获取banner
  Future<String> getBanner() async {
    var response = await dio.get('banner/json');
    return response.data.toString();
  }
}
